package com.wk.unreal.yyzxserver.service.impl;

import com.wk.unreal.yyzxserver.dto.Result;
import com.wk.unreal.yyzxserver.entity.User;
import com.wk.unreal.yyzxserver.mapper.UserMapper;
import com.wk.unreal.yyzxserver.service.UserService;
import com.wk.unreal.yyzxserver.util.JwtUtil;
import com.wk.unreal.yyzxserver.util.MD5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;


@Service
public class UserServiceImpl implements UserService {

    // 注入 Redis 模板对象
    @Autowired
    private StringRedisTemplate redisTemplate;

    @Autowired
    private UserMapper userMapper;

    @Override
    public Result login(String username, String password) {
        // 通过账号查询
        User user = userMapper.findByUsername(username);
        // 存在
        if (user != null) {
            /*
             密码校验
             1. 把登入的密码加密处理
             2. 用数据库查询的密码与登入加密之后的密码做对比
             */
            password = MD5Util.getMD5(password);
            // 密码一致
            if (password.equals(user.getPassword())) {

                // 生成 token
                Map<String, Object> claims = new HashMap<>();
                claims.put("id", user.getId());
                claims.put("username", user.getUsername());
                claims.put("password", user.getPassword());
                claims.put("nickname", user.getPassword());
                claims.put("roleId", user.getRoleId());
                String token = JwtUtil.getToken(claims);
                // 把 token 保存到 redis 中
                ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
                /*
                第一个参数 key
                第二个参数 value
                第三个参数 时间设置
                第四个参数 时间单位
                 */
                valueOperations.set(token, token, 1, TimeUnit.HOURS);

                return Result.success().message("登入成功").data(token);
            }
        }
        return Result.fail().message("登入失败");
    }
}
